home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / wais / ui / util.c < prev    next >
C/C++ Source or Header  |  1995-05-09  |  3KB  |  144 lines

  1. /* 
  2.   WIDE AREA INFORMATION SERVER SOFTWARE:
  3.    No guarantees or restrictions.  See the readme file for the full standard
  4.    disclaimer.
  5.  
  6.    This is part of the shell user-interface tools for the WAIS software.
  7.    Do with it as you please.
  8.  
  9.    jonathan@Think.COM
  10.  
  11.  * $Log:    util.c,v $
  12.  * Revision 1.13  92/03/17  14:32:21  jonathan
  13.  * Generally cleaned up.
  14.  * 
  15.  * Revision 1.12  92/03/08  09:17:48  jonathan
  16.  * Fixed strip_lf.
  17.  * 
  18.  * Revision 1.11  92/03/08  09:12:33  jonathan
  19.  * Added new function, strip_lf.
  20.  * 
  21.  */
  22.  
  23. #ifndef lint
  24. static char *RCSid = "$Header: /tmp_mnt/net/quake/proj/wais/wais-8-b5/ui/RCS/util.c,v 1.13 92/03/17 14:32:21 jonathan Exp $";
  25. #endif
  26.  
  27. #define _C_UTIL
  28.  
  29. #include "wais.h"
  30. #include "globals.h"
  31.  
  32. int charlistlength(list)
  33. char **list;
  34. {
  35.   int num;
  36.  
  37.   if(list) {
  38.     for(num = 0; list[num] != NULL; num++);
  39.     return num;
  40.   }
  41.   else 
  42.     return 0;
  43. }
  44.  
  45. int listlength(list)
  46. List list;
  47. {
  48.   int num;
  49.   List l;
  50.  
  51.   for(num = 0, l = list; l != NULL; num++, l = l->nextNode);
  52.  
  53.   return num;
  54. }
  55.  
  56. #define BEFORE 1
  57. #define DURING 2
  58. #define QUOTE 5
  59.  
  60. /* ripped out of gmacs-ui.c */
  61. int find_string_slot(source, key, value, value_size, delete_internal_quotes)
  62. char *source, *key, *value;
  63. long value_size;
  64. Boolean delete_internal_quotes;
  65. {
  66.   char ch;
  67.   short state = BEFORE;
  68.   long position = 0;  /* position in value */
  69.   char *pos =strstr(source, key); /* address into source */
  70.  
  71.   value[0] = '\0';        /* initialize to nothing */
  72.  
  73.   if(NULL == pos)
  74.     return(1);
  75.  
  76.   for(pos = pos + strlen(key); pos < source + strlen(source); pos++){
  77.     ch = *pos;
  78.     if((state == BEFORE) && (ch == '\"'))
  79.       state = DURING;
  80.     else if ((state == DURING) && (ch == '\\')){
  81.       state = QUOTE;    
  82.       if(!delete_internal_quotes){
  83.     value[position] = ch;
  84.     position++;
  85.     if(position >= value_size){
  86.       value[value_size - 1] = '\0';
  87.       return(-1);
  88.     }
  89.       }
  90.     }
  91.     else if ((state == DURING) && (ch == '"')){    
  92.       value[position] = '\0';
  93.       return(0);
  94.     }
  95.     else if ((state == QUOTE) || (state == DURING)){
  96.       if(state ==  QUOTE)
  97.     state = DURING;
  98.       value[position] = ch;
  99.       position++;
  100.       if(position >= value_size){
  101.     value[value_size - 1] = '\0';
  102.     return(-1);
  103.       }
  104.     }
  105.     /* otherwise we are still before the start of the value */
  106.   }
  107.   value[position] = '\0';
  108.   return(-1); /* error because we are in the middle of the string */
  109. }
  110.  
  111. void find_value(source, key, value, value_size)
  112. char *source, *key, *value;
  113. int value_size;
  114. {
  115.   char ch;
  116.   long position = 0;  /* position in value */
  117.   char *pos =strstr(source, key); /* address into source */
  118.  
  119.   value[0] = '\0';        /* initialize to nothing */
  120.  
  121.   if(NULL == pos)
  122.     return;
  123.  
  124.   pos = pos + strlen(key);
  125.   ch = *pos;
  126.   /* skip leading quotes and spaces */
  127.   while((ch == '\"') || (ch == ' ')) {
  128.     pos++; ch = *pos;
  129.   }
  130.   for(position = 0; pos < source + strlen(source); pos++){
  131.     if((ch = *pos) == ' ') {
  132.       value[position] = '\0';
  133.       return;
  134.     }
  135.     value[position] = ch;
  136.     position++;
  137.     if(position >= value_size){
  138.       value[value_size - 1] = '\0';
  139.       return;
  140.     }
  141.   }
  142.   value[position] = '\0';
  143. }
  144.